#include <unordered_map>
#include "server_Bomberman.h"
#include "server_Coordenada.h"
#include "server_IOcupante.h"
#include "server_Configuracion.h"
#include <string>
#include <iostream>
#define VIDAS 3

using std::string;
using std::cout;
using std::endl;
using std::unordered_map;

Bomberman::Bomberman() {
    vidasRestantes = VIDAS;
    respawn = false;
    vive = true;
    bombaCreada = false;
    tiempoInmunidad = 0;
    tiempoRegeneracionBomba = Configuracion::getTiempoRegeneracionBomba();
    estadoRegeneracion = tiempoRegeneracionBomba;
    codigo = string("a");
    direccion = string("ninguna");
}

Bomberman::Bomberman(Coordenada c) {
    posicion = c;
    vidasRestantes = VIDAS;
    respawn = false;
    vive = true;
    bombaCreada = false;
    tiempoInmunidad = 0;
    tiempoRegeneracionBomba = Configuracion::getTiempoRegeneracionBomba();
    estadoRegeneracion = tiempoRegeneracionBomba;
    codigo = string("a");
    direccion = string("ninguna");
}

Bomberman::~Bomberman() {
}

int Bomberman::getVidasRestantes() {
    return vidasRestantes;
}

void Bomberman::resetVidas() {
    vive = true;
    vidasRestantes = VIDAS;
}

void Bomberman::atacar() {
}

void Bomberman::restarVida() {
    vidasRestantes--;
    respawn = true;
    if (vidasRestantes == 0) {
        vive = false;
    }
}

void Bomberman::colisionarConBomberman(IOcupante* bomberman) {
}

void Bomberman::colisionarConBombaPlanta() {
    restarVida();
}

void Bomberman::colisionarConZombie() {
    restarVida();
}

void Bomberman::colisionarCon(IOcupante* ocupante) {
    ocupante->colisionarConBomberman(this);
}

void Bomberman::crearBomba() {
    if (tiempoRegeneracionBomba <= estadoRegeneracion) {
        bombaCreada = true;
        estadoRegeneracion = 0;
    }
}

BombaBomberman* Bomberman::colocarBomba() {
    bombaCreada = false;
    return (new BombaBomberman(posicion, Configuracion::getAlcanceBomba(),
            Configuracion::getTiempoDetonacionBomba()));
}

void Bomberman::recibirExplosion() {
    this->restarVida();
}

bool Bomberman::respawnear() {
    return respawn;
}

bool Bomberman::listoParaColocarBomba() {
    if (tiempoRegeneracionBomba > estadoRegeneracion)
        estadoRegeneracion++;
    return bombaCreada;
}

string Bomberman::serializar() {
    if (direccion != string("ninguna"))
        codigo = codigos[direccion];
    return codigo;
}

void Bomberman::setSerial(unordered_map<string, string> serial) {
    codigos = serial;
    codigo = codigos["abajo"];
}

void Bomberman::setDireccion(string dir) {
    direccion = dir;
    codigo = codigos[direccion];
}